da4fdsa6
da4fdsa6

Reputation: 85

awk add word before each uniq pattern based on column number 4

hello how i will at begin and end of every each new pattern in column $4 in a file for specified in desired output number of lines all the time differ along with diff. OS types in column $4

this not worked for me

awk -v RS= '{$0 = "OS_PLATFORM_VALID_BEGIN\n" $4 "\nOS_PLATFORM_VALID_END"} 1'file
awk -v RS= '{$0 = "OS_PLATFORM_VALID_BEGIN\n" $1" "$2" "$3 $4" "$5 " "$6" "$7" "$8" "$9"\nOS_PLATFORM_VALID_END"} 1' file

this not worked for me above

LIB SITE A LINUX X64 DC58 ROOM DC LOC 2.b
LIB SITE A LINUX X64 DC58 ROOM DC LOC 2.b
LIB SITE A OPENV X64 DC22 ROOM DC LOC 2.b
LIB SITE A OPENV X64 DC22 ROOM DC LOC 2.b
LIB SITE A OPENV X64 DC22 ROOM DC LOC 2.b
LIB SITE A WIN9K X64 DC22 ROOM DC LOC 2.b
LIB SITE A WIN9K X64 DC22 ROOM DC LOC 2.b
LIB SITE A WIN9K X64 DC22 ROOM DC LOC 2.b
LIB SITE A WIN9K X64 DC22 ROOM DC LOC 2.b
LIB SITE B RHEL X64 DC10 ROOM DE LOC 3.ma
LIB SITE B RHEL X64 DC10 ROOM DE LOC 3.ma
LIB SITE B RHEL X64 DC10 ROOM DE LOC 3.ma
LIB SITE B RHEL X64 DC10 ROOM DE LOC 3.ma
LIB SITE B SUSE X64 DC10 ROOM DE LOC 3.ma
LIB SITE B SUSE X64 DC10 ROOM DE LOC 3.ma
LIB SITE B SUSE X64 DC10 ROOM DE LOC 3.ma
LIB SITE B SUSE X64 DC10 ROOM DE LOC 3.ma
LIB SITE A LINUX X64 DC41 ROOM DF LOC 5.p
LIB SITE A LINUX X64 DC41 ROOM DF LOC 5.p
LIB SITE A LINUX X64 DC41 ROOM DF LOC 5.p
LIB SITE A LINUX X64 DC41 ROOM DF LOC 5.p
LIB SITE A OPENV X64 DC41 ROOM DF LOC 5.p
LIB SITE A OPENV X64 DC41 ROOM DF LOC 5.p
LIB SITE A OPENV X64 DC41 ROOM DF LOC 5.p

this how it should look like:

OS_PLATFORM_VALID_BEGIN
LIB SITE A LINUX X64 DC58 ROOM DC LOC 2.b
LIB SITE A LINUX X64 DC58 ROOM DC LOC 2.b
OS_PLATFORM_VALID_END
OS_PLATFORM_VALID_BEGIN
LIB SITE A OPENV X64 DC22 ROOM DC LOC 2.b
LIB SITE A OPENV X64 DC22 ROOM DC LOC 2.b
LIB SITE A OPENV X64 DC22 ROOM DC LOC 2.b
OS_PLATFORM_VALID_END
OS_PLATFORM_VALID_BEGIN
LIB SITE A WIN9K X64 DC22 ROOM DC LOC 2.b
LIB SITE A WIN9K X64 DC22 ROOM DC LOC 2.b
LIB SITE A WIN9K X64 DC22 ROOM DC LOC 2.b
LIB SITE A WIN9K X64 DC22 ROOM DC LOC 2.b
OS_PLATFORM_VALID_END
OS_PLATFORM_VALID_BEGIN
LIB SITE B RHEL X64 DC10 ROOM DE LOC 3.ma
LIB SITE B RHEL X64 DC10 ROOM DE LOC 3.ma
LIB SITE B RHEL X64 DC10 ROOM DE LOC 3.ma
LIB SITE B RHEL X64 DC10 ROOM DE LOC 3.ma
OS_PLATFORM_VALID_END
OS_PLATFORM_VALID_BEGIN
LIB SITE B SUSE X64 DC10 ROOM DE LOC 3.ma
LIB SITE B SUSE X64 DC10 ROOM DE LOC 3.ma
LIB SITE B SUSE X64 DC10 ROOM DE LOC 3.ma
LIB SITE B SUSE X64 DC10 ROOM DE LOC 3.ma
OS_PLATFORM_VALID_END
OS_PLATFORM_VALID_BEGIN
LIB SITE A LINUX X64 DC41 ROOM DF LOC 5.p
LIB SITE A LINUX X64 DC41 ROOM DF LOC 5.p
LIB SITE A LINUX X64 DC41 ROOM DF LOC 5.p
LIB SITE A LINUX X64 DC41 ROOM DF LOC 5.p
OS_PLATFORM_VALID_END
OS_PLATFORM_VALID_BEGIN
LIB SITE A OPENV X64 DC41 ROOM DF LOC 5.p
LIB SITE A OPENV X64 DC41 ROOM DF LOC 5.p
LIB SITE A OPENV X64 DC41 ROOM DF LOC 5.p
OS_PLATFORM_VALID_END

Upvotes: 1

Views: 59

Answers (1)

Wiktor Stribiżew
Wiktor Stribiżew

Reputation: 626861

You may use

awk 'BEGIN{print "OS_PLATFORM_VALID_BEGIN"} 
    { if (!seen[$4]++ && NR>1) { 
        print "OS_PLATFORM_VALID_END" ORS "OS_PLATFORM_VALID_BEGIN" } 
    }1;
    END{print "OS_PLATFORM_VALID_END"}' file > outfile

See the online awk demo

Details

  • BEGIN{print "OS_PLATFORM_VALID_BEGIN"} - at the start of the script execution, prints OS_PLATFORM_VALID_BEGIN
  • { if (!seen[$4]++ && NR>1) { print "OS_PLATFORM_VALID_END" ORS "OS_PLATFORM_VALID_BEGIN" } }1 - if there is a unqiue occurrence of Field 4 value and it is not a first line, print OS_PLATFORM_VALID_END and OS_PLATFORM_VALID_BEGIN lines, else, just print the line (1 at the end is the default line output triggering construct)
  • END{print "OS_PLATFORM_VALID_END"} - the OS_PLATFORM_VALID_END is printed at the end of the script.

Upvotes: 1

Related Questions