我收集了 3 个字段的数据。我想将第三个字段数据打印到一行中。这是我得到的数据。
$ cat file
1234 1234 dei_1/3,dei_2/3,dei_9/0,
dei_10/0,dei_8/4
2345 2345 dei_8/9,dei_5/6,dei_4/9
4244 4244 dei_0/9,dei_4/6,dei_4/1
4235 4235 dei_0/9,dei_4/6,dei_4/,de
i_9/7,dei_1/3,dei_2/3,dei_9/0
预期结果:
1234 1234 dei_1/3,dei_2/3,dei_9/0,dei_10/0,dei_8/4
2345 2345 dei_8/9,dei_5/6,dei_4/9
4244 4244 dei_0/9,dei_4/6,dei_4/1
4235 4235 dei_0/9,dei_4/6,dei_4/,dei_9/7,dei_1/3,dei_2/3,dei_9/0
到目前为止我拥有的代码
while read file; do if [[ $file == 1 ]]; then echo -n; fi; done
答案1
以下脚本将任何不以 2 个数字开头的行与上一行连接:
$ awk -v ORS="" '$1~/^[0-9]+$/ && $2~/^[0-9]+$/ && NR>1{printf "\n"}1' file
1234 1234 dei_1/3,dei_2/3,dei_9/0,dei_10/0,dei_8/4
2345 2345 dei_8/9,dei_5/6,dei_4/9
4244 4244 dei_0/9,dei_4/6,dei_4/1
4235 4235 dei_0/9,dei_4/6,dei_4/,dei_9/7,dei_1/3,dei_2/3,dei_9/0
这依赖于ORS
重置为空字符串的(输出记录分隔符)。如果前 2 个字段是数字(并且不是第一行),则会添加换行符。
答案2
短的sed
方法:
sed -E 'N; s/\n([^[:space:]]*,[^[:space:]]+)/\1/' file
输出:
1234 1234 dei_1/3,dei_2/3,dei_9/0,dei_10/0,dei_8/4
2345 2345 dei_8/9,dei_5/6,dei_4/9
4244 4244 dei_0/9,dei_4/6,dei_4/1
4235 4235 dei_0/9,dei_4/6,dei_4/,dei_9/7,dei_1/3,dei_2/3,dei_9/0
答案3
几种 awk 方法:
存储以数字开头的最新行,如果当前行不以数字开头,则追加到该行
awk '
/^[[:digit:]]/ {if (prev) print prev; prev=$0; next}
{prev = prev $0}
END {if (prev) print prev}
' file
反转文件。如果一行以非数字开头,则读取下一行并附加上一行。反转结果。我假设一条记录最多被分割1次
tac file | awk '/^[^[:digit:]]/ {this = $0; getline; $0 = $0 this} 1' | tac