删除列 awk

Remove column awk

我有输入文件:

HEADER 1     |  HEADER 2   |  HEADER 3      |  HEADER 3   | HEADER 4       |
1356438283301|1356438284971|1356438292151697|1356438284972|1356438292151693|
1356438283301|1356438284971|1356438292151697|1356438284972|1356438292151693|
1356438283301|1356438284971|1356438292151697|1356438284972|1356438292151693|

我希望我的文件是这样的:(包含 3 个带有 header 和预告片的拆分文件加上删除前 3 列

DETAIL 07032017
 HEADER 1    |  HEADER 2      |       
1356438284972|1356438292151693|
EOF 3

DETAIL 07032017
 HEADER 1    |  HEADER 2      |
1356438284972|1356438292151693|
EOF 3

DETAIL 07032017
 HEADER 1    |  HEADER 2      |
1356438284972|1356438292151693|
EOF 3

至于我现在的命令;

awk -v date="$(date +"%d%m%Y")" -F\| 'NR==1 {h=[=12=]; next} 
{file="FILE_""_""_"date".csv";  
print (a[file]++?"": "DM9 "date"" ORS h ORS) [=12=]> file} END{for(file in a)     
print "EOF " a[file] > file}' testing.csv

我只能得到(如上面的命令)我可以拆分文件,添加 header 和预告片但 尚未删除列

DETAIL 07032017
 HEADER 1    |  HEADER 2   |  HEADER 3      |  HEADER 3   | HEADER 4       |
1356438283301|1356438284971|1356438292151697|1356438284972|1356438292151693| 
EOF 3

DETAIL 07032017
 HEADER 1    |  HEADER 2   |  HEADER 3      |  HEADER 3   | HEADER 4       |
1356438283301|1356438284971|1356438292151697|1356438284972|1356438292151693| 
EOF 3

DETAIL 07032017
 HEADER 1    |  HEADER 2   |  HEADER 3      |  HEADER 3   | HEADER 4       |
1356438283301|1356438284971|1356438292151697|1356438284972|1356438292151693|
EOF 3

以上命令仅用于拆分,添加header和带有记录数的尾部。

但我想在拆分后删除前 3 列并添加 header 尾部。可能吗?

或者我需要拆分然后删除,只剩下最后一个做 header 和预告片?

我试试这个;

awk -v date="$(date +"%d%m%Y")" -F\| 'NR==1 {h=[=14=]; next} 
{file="FILE_""_""_"date".csv";  
print (a[file]++?"": "DM9 "date"" ORS h ORS)**substr([=14=], index([=14=],))**>             file} END{for(file in a) print "EOF " a[file] > file}' testing.csv

我使用了 substr 但根本不起作用。

我想删除前 3 列

试试这个 -

    awk -v date="$(date +"%d%m%Y")" -F\| 'BEGIN{print "DETAIL " date} {print ,FS} END {print "EOF " NR}' OFS="|"  f
DETAIL 07032017
1356438284972|1356438292151693|
1356438284972|1356438292151693|
1356438284972|1356438292151693|
EOF 3
awk -v Date="$(date +'%d%m%Y')" '
   # print header
   BEGIN { print "DETAIL " Date }
   # prepare new content
      { sub( /([^|][|]){3}/, "") }
   # print new content
   7
   # print footer
   END { print "\nEOF " NR }
   # redirect output to your final file
   ' YourSource > YourFile

正如我在之前 post 中所写,您可以使用 substr([=11=], index([=11=],)) 删除第 1 至 3 列。 您上面的示例文件缺少 header,所以我添加了一个 header 来进行测试。

下面的测试结果应该符合您的预期。

如果在您的机器上这不起作用,可能是您的 PC 有问题。

echo "cat data.csv"
cat data.csv
echo "awk - started "
awk -v date="$(date +"%d%m%Y")" -F"|" 'NR==1 {h=substr([=10=], index([=10=],)); next} \
{file="FILE_""_""_"date".csv";print (a[file]++?"": "DM9 "date"" ORS h ORS) substr([=10=], index([=10=],)) >file } \
END{for(file in a) print "EOF " a[file] >file}' data.csv
echo "awk - finished "
echo "csv file generated:"
cat FILE*.csv
echo "script finish"

#Terminal Output:
cat data.csv
Header1|Header2|Header3|Header4|Header5|
1356438283301|1356438284971|1356438292151697|1356438284972|1356438292151693| 
1356438283301|1356438284971|1356438292151697|1356438284972|1356438292151693|
1356438283301|1356438284971|1356438292151697|1356438284972|1356438292151693|
awk - started
awk - finished
csv file generated:
DM9 07032017
Header4|Header5|
1356438284972|1356438292151693|
1356438284972|1356438292151693|
1356438284972|1356438292151693|
EOF 3
script finish